﻿using HandyControl.Properties.Langs;
using Org.BouncyCastle.Asn1.X509.Qualified;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using ZoneLinePacking.Models.Dto;

namespace ZoneLinePacking.Core.Extensions
{
    /// <summary>
    /// Enum的扩展方法
    /// </summary>
    public static class EnumExtensions
    {
        /// <summary>
        /// 获取特性 (DisplayAttribute) 的名称；如果未使用该特性，则返回枚举的名称。
        /// </summary>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static string GetDisplayName(this Enum enumValue)
        {
            FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
            DisplayAttribute[] attrs =
                fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[];
            //var lang = string.IsNullOrEmpty(LangProvider.GetMessage(attrs[0].Name)) ? attrs[0].Name : LangProvider.GetMessage(attrs[0].Name);
            //return attrs.Length > 0 ? LangProvider.GetMessage(attrs[0].Name) : enumValue.ToString();
            return attrs.Length > 0 ? attrs[0].Name : enumValue.ToString();
        }

        /// <summary>
        /// 获取特性 (DisplayAttribute) 的说明；如果未使用该特性，则返回枚举的名称。
        /// </summary>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static string GetDisplayDescription(this Enum enumValue)
        {
            FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
            DisplayAttribute[] attrs =
                fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[];
            //var lang = string.IsNullOrEmpty(LangProvider.GetMessage(attrs[0].Description)) ? attrs[0].Description : LangProvider.GetMessage(attrs[0].Description);
            return attrs.Length > 0 ? attrs[0].Description : enumValue.ToString();
        }

        /// <summary>
        /// 获取特性 (DescriptionAttribute) 的说明；如果未使用该特性，则返回枚举的名称。
        /// </summary>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static string GetDescription(this Enum enumValue)
        {
            FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
            DescriptionAttribute[] attrs =
                fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];

            //return attrs.Length > 0 ? LangProvider.GetMessage(attrs[0].Description) : enumValue.ToString();
            return attrs.Length > 0 ? attrs[0].Description : enumValue.ToString();
        }

        /// <summary>
        /// 直接获取特性（更轻量、更容易使用，不用封装“获取每一个自定义特性”的扩展方法）
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="enumValue"></param>
        /// <returns></returns>
        public static T GetAttributeOfType<T>(this Enum enumValue) where T : Attribute
        {
            Type type = enumValue.GetType();
            MemberInfo[] memInfo = type.GetMember(enumValue.ToString());
            object[] attributes = memInfo[0].GetCustomAttributes(typeof(T), false);
            return (attributes.Length > 0) ? (T)attributes[0] : null;
        }


        /// <summary>
        /// 将枚举转化为ComboxItemDto
        /// </summary>
        /// <returns></returns>
        public static List<Models.Dto.ComboxItemDto> ConvertToComboxItems<T>() where T : Enum {
            var elist = Enum.GetValues(typeof(T)).Cast<Enum>().Select(o => {
                ComboxItemDto comboxItemDto = new ComboxItemDto();
                comboxItemDto.Descr = o.GetDescription();
                comboxItemDto.Index = Convert.ToInt32(o);
                comboxItemDto.Key = o.ToString();
                comboxItemDto.Content = o;
                return comboxItemDto;
            }).ToList();
            return elist;
        }

    }
}
